package q1.project.web.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import q1.project.web.interceptor.TenantFilterInterceptor;
import q1.project.common.interceptor.TenantInterceptor;

/**
 * 租户感知的 Web MVC 配置 配置租户拦截器链，实现自动租户隔离
 *
 * <h3>拦截器执行顺序：</h3>
 *
 * <ol>
 *   <li><strong>TenantInterceptor</strong>（Order=1）：解析并设置租户上下文
 *       <ul>
 *         <li>从请求头获取租户ID（X-Tenant-Id）或租户编码（X-Tenant-Code）
 *         <li>从子域名解析租户标识
 *         <li>设置租户上下文到 TenantContext
 *       </ul>
 *   <li><strong>TenantFilterInterceptor</strong>（Order=2）：启用 Hibernate Filter
 *       <ul>
 *         <li>根据租户上下文启用 @Filter
 *         <li>所有后续查询自动添加租户过滤条件
 *       </ul>
 * </ol>
 *
 * @author Q1 Team
 * @version 1.0
 */
@Configuration
public class TenantWebMvcConfig implements WebMvcConfigurer {

  private final TenantInterceptor tenantInterceptor;
  private final TenantFilterInterceptor tenantFilterInterceptor;

  public TenantWebMvcConfig(
      TenantInterceptor tenantInterceptor, TenantFilterInterceptor tenantFilterInterceptor) {
    this.tenantInterceptor = tenantInterceptor;
    this.tenantFilterInterceptor = tenantFilterInterceptor;
  }

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    // 第一步：设置租户上下文（从请求头、子域名等提取租户信息）
    registry
        .addInterceptor(tenantInterceptor)
        .addPathPatterns("/**")
        .excludePathPatterns(
            "/actuator/**", // 健康检查
            "/swagger-ui/**", // Swagger 文档
            "/v3/api-docs/**", // API 文档
            "/error", // 错误页面
            "/favicon.ico" // 图标
            )
        .order(1);

    // 第二步：启用租户过滤器（自动为所有查询添加租户条件）
    registry
        .addInterceptor(tenantFilterInterceptor)
        .addPathPatterns("/**")
        .excludePathPatterns(
            "/actuator/**", "/swagger-ui/**", "/v3/api-docs/**", "/error", "/favicon.ico")
        .order(2);
  }
}
